package main

import "fmt"

type Person struct {
	name string
	age  int8
}

func (p Person) nextYearAge1() {
	fmt.Printf("p4: 方法中的地址 %p \n", &p)
	p.age++
}

func (p *Person) nextYearAge2() {
	fmt.Printf("p5: 方法中的地址 %p \n", p)
	p.age++
}

func main() {
	//使用var 初始化;返回的是该实例的结构类型
	//使用了var关键字之后不需要初始化，这和其他的语言有些不同。Golang会自动分配内存空间，并将该内存空间设置为默认的值，我们只需要按需进行赋值即可。
	var p Person
	p.age = 18
	p.name = "jack"

	//使用使用new函数 返回的是一个指向这个结构类型的一个指针，是地址
	p2 := new(Person)
	p2.age = 12
	p2.name = "tom"

	//使用字面量 返回的是一个指向这个结构类型的一个指针，是地址
	p3 := Person{"king", 12}

	fmt.Println("修改前 p3 : {}", p3)
	//对于指针类型的数值，应该要先用*取值，然后再修改。
	//但是，在Golang中，可以省略这一步骤，p3.age = 18
	p3.age = 18
	fmt.Println("方式1修改后: p3 {}", p3)
	//对于指针类型的数值，应该要先用*取值，然后再修改。

	//接收者：指针接收者和非指针接受者
	p4 := Person{"jams", 55}
	p5 := &Person{"kim", 55}

	fmt.Printf("p4: main中的地址 %p \n", &p4)
	fmt.Printf("p5: main中的地址 %p \n", p5)

	p4.nextYearAge1()
	p5.nextYearAge2()

	fmt.Println("p4: {}", p4)

	fmt.Println("p5: {}", p5)
}
